#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <regex>
#include <errno.h>
#include <mysql/mysql.h>

#include "../buffer/buffer.h"
#include "../log/log.h"
#include "../pool/sqlconnpool.h"
#include "../pool/sqlconnRAII.h"

//用于解析和存储HTTP请求信息的类
class HttpRequest
{
public:
//表示HTTP请求解析的状态机状态
enum PARSE_STATE {
    //解析请求行
    REQUEST_LINE,
    //解析请求头
    HEADERS,
    //解析请求体
    BODY,
    //解析完成
    FINISH,        
};
//表示HTTP请求的处理结果代码
enum HTTP_CODE {
    //未完成请求解析
    NO_REQUEST = 0,
    //成功获取有效请求
    GET_REQUEST,
    //请求格式错误
    BAD_REQUEST,
    //请求资源不存在
    NO_RESOURSE,
    //禁止访问请求资源
    FORBIDDENT_REQUEST,
    //文件请求
    FILE_REQUEST,
    //服务器内部错误
    INTERNAL_ERROR,
    //连接已关闭
    CLOSED_CONNECTION,
};
    //构造函数，初始化请求对象
    HttpRequest(){Init();}
    //析构函数，默认析构函数
    ~HttpRequest() = default;
    //初始化请求对象，将请求行、请求头、请求体等信息清空
    void Init();
    //解析HTTP请求，将请求信息存储到对象中
    bool parse(Buffer& buff);
    //获取请求路径
    std::string path() const;
    //获取请求路径的引用
    std::string& path();
    //获取请求方法
    std::string method() const;
    //获取HTTP版本
    std::string version() const;
    //获取POST请求参数，参数是一个字符串
    std::string GetPost(const std::string& key) const;
    //获取POST请求参数，参数是一个字符指针
    std::string GetPost(const char* key) const;
    //判断是否保持连接
    bool IsKeepAlive() const;

private:
    //解析请求行
    bool ParseRequestLine_(const std::string& line);
    //解析请求头
    void ParseHeader_(const std::string& line);
    //解析HTTP请求正文
    void ParseBody_(const std::string& line);
    //解析HTTP请求路径
    void ParsePath_();
    //解析POST请求参数
    void ParsePost_();
    //解析application/x-www-form-urlencoded格式的POST数据
    void ParseFromUrlencoded_();
    //验证用户登录/注册信息
    static bool UserVerify(const std::string& name,const std::string& pwd,bool isLogin);
    //解析当前状态的变量
    PARSE_STATE state_;
    //HTTP的请求方法，请求资源路径，HTTP版本，请求正文内容
    std::string method_,path_,version_,body_;
    //存储HTTP请求头键值对的哈希表
    std::unordered_map<std::string,std::string> header_;
    //存储POST请求参数键值对的哈希表
    std::unordered_map<std::string,std::string> post_;
    //默认HTML文件集合
    static const std::unordered_set<std::string> DEFAULT_HTML;
    //静态成员，HTML文件与标签ID的映射
    static const std::unordered_map<std::string,int> DEFAULT_HTML_TAG;
    //静态方法，将16进制字符转换为整数
    static int ConverHex(char ch);
};
#endif
